home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / editors / mjovesrc.zoo / argcount.c < prev    next >
C/C++ Source or Header  |  1992-04-04  |  3KB  |  169 lines

  1. /***************************************************************************
  2.  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
  3.  * is provided to you without charge, and with no warranty.  You may give  *
  4.  * away copies of JOVE, including sources, provided that this notice is    *
  5.  * included in all the files.                                              *
  6.  ***************************************************************************/
  7.  
  8. #include "jove.h"
  9. #include "ctype.h"
  10.  
  11. private    void
  12.     gather_numeric_argument proto((int)),
  13.     quad_numeric_arg proto((void));
  14.  
  15. int    arg_supplied_p,    /* NO, YES, or YES_NODIGIT */
  16.     arg_count;
  17.  
  18. /* called by C-U to gather a numeric argument, either C-U's or digits,
  19.    but not both */
  20.  
  21. void
  22. TimesFour()
  23. {
  24.     quad_numeric_arg();
  25. }
  26.  
  27. /* This initializes the numeric argument to 1 and starts multiplying
  28.    by 4 (the magic number Stallman came up with).  It is an error to
  29.    invoke quad_numeric_arg() interactively (via TimesFour()), because
  30.    it uses the LastKeyStruck variable to know what character signals
  31.    to multiply again (in the loop). */
  32. private void
  33. quad_numeric_arg()
  34. {
  35.     int    oldc = LastKeyStruck,
  36.         newc,
  37.         narg_count,
  38.         slow;
  39.  
  40.     slow = NO;
  41.     arg_supplied_p = YES;
  42.     arg_count = 1;
  43.     this_cmd = ARG_CMD;
  44.     do {
  45.         if ((narg_count = arg_count * 4) != 0)
  46.             arg_count = narg_count;
  47.         newc = waitchar(&slow);
  48.         if (jisdigit(newc) || newc == '-') {
  49.              arg_supplied_p = NO;
  50.              gather_numeric_argument(newc);
  51.              return;
  52.         }
  53.     } while (newc == oldc);
  54.     Ungetc(newc);
  55. }
  56.  
  57. private void
  58. gather_numeric_argument(c)
  59.     int    c;
  60. {
  61.     int    sign = 0;
  62.     static bool    digited;
  63.     int    slow = NO;
  64.  
  65.     if (!jisdigit(c) && c != '-')
  66.         complain((char *)NULL);
  67.     if (arg_supplied_p == NO) {    /* if we just got here */
  68.         arg_count = 0;    /* start over */
  69.         digited = NO;
  70.     } else if (arg_supplied_p == YES_NODIGIT) {
  71.         sign = (arg_count < 0) ? -1 : 1;
  72.         arg_count = 0;
  73.     }
  74.  
  75.     if (!sign)
  76.         sign = (arg_count < 0) ? -1 : 1;
  77.     if (sign == -1)
  78.         arg_count = -arg_count;
  79.     if (c == '-') {
  80.         sign = -sign;
  81.         c = waitchar(&slow);
  82.     }
  83.     for (;;) {
  84.         if (jisdigit(c)) {
  85.             arg_count = (arg_count * 10) + (c - '0');
  86.             digited = YES;
  87.         } else {
  88.             if (digited)
  89.                 arg_supplied_p = YES;
  90.             else {
  91.                 arg_count = 1;
  92.                 if (arg_supplied_p == NO)
  93.                     arg_supplied_p = YES_NODIGIT;
  94.             }
  95.             arg_count *= sign;
  96.             this_cmd = ARG_CMD;
  97.             Ungetc(c);
  98.             return;
  99.         }
  100.         c = waitchar(&slow);
  101.     }
  102. }
  103.  
  104. void
  105. Digit()
  106. {
  107.     gather_numeric_argument(LastKeyStruck);
  108. }
  109.  
  110. void
  111. Digit0()
  112. {
  113.     gather_numeric_argument('0');
  114. }
  115.  
  116. void
  117. Digit1()
  118. {
  119.     gather_numeric_argument('1');
  120. }
  121.  
  122. void
  123. Digit2()
  124. {
  125.     gather_numeric_argument('2');
  126. }
  127.  
  128. void
  129. Digit3()
  130. {
  131.     gather_numeric_argument('3');
  132. }
  133.  
  134. void
  135. Digit4()
  136. {
  137.     gather_numeric_argument('4');
  138. }
  139.  
  140. void
  141. Digit5()
  142. {
  143.     gather_numeric_argument('5');
  144. }
  145.  
  146. void
  147. Digit6()
  148. {
  149.     gather_numeric_argument('6');
  150. }
  151.  
  152. void
  153. Digit7()
  154. {
  155.     gather_numeric_argument('7');
  156. }
  157.  
  158. void
  159. Digit8()
  160. {
  161.     gather_numeric_argument('8');
  162. }
  163.  
  164. void
  165. Digit9()
  166. {
  167.     gather_numeric_argument('9');
  168. }
  169.